﻿using QuanLyKhachSan.Validation;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DataAccess;
using System.Linq.Expressions;

namespace QuanLyKhachSan
{
    public class KhachHangManager : IValidator<KhachHang>,ILenhThucThi<KhachHang>
    {
        public ValidateResult Validate(KhachHang obj)
        {
            var vResult = new ValidateResult();
            if (obj.MaKH.Trim()=="KH")
            {
                vResult.Message.Add("Chưa nhập mã khách hàng");
            }
            else
            {
                if (obj.MaKH.Length < 10)
                {
                    vResult.Message.Add("Mã khách hàng phải chứa đủ 10 kí tự");
                }
                if (obj.MaKH.Trim().Contains(' '))
                {
                    vResult.Message.Add("Mã khách hàng không được phép chứa kí tự khoảng trắng");
                }
            }
            if (string.IsNullOrEmpty(obj.HoTenKH.Trim()))
            {
                vResult.Message.Add("Chưa nhập vào họ tên khách hàng");
            }
            if (string.IsNullOrEmpty(obj.NgheNghiep.Trim()))
            {
                vResult.Message.Add("Chưa nhập vào nghề nghiệp");
            }
            if (string.IsNullOrEmpty(obj.SDT.Trim()))
            {
                vResult.Message.Add("Chưa nhập vào số điện thoại");
            }
            if (string.IsNullOrEmpty(obj.MaQT.Trim()))
            {
                vResult.Message.Add("Chưa nhập mã quốc tịch");
            }
            if (obj.NgaySinh > DateTime.Now)
            {
                vResult.Message.Add("Ngày sinh vừa nhập đã vượt quá thời gian hiện hành");
            }
            return vResult;
        }

        public ActionResult Them(KhachHang obj)
        {
            ActionResult aResult = new ActionResult();
            using(QLKhachSanContext context=new QLKhachSanContext())
            {
                var query = from kh in context.KhachHangs
                            where kh.MaKH == obj.MaKH
                            select kh;
                try
                {
                    if (query.Any())
                    {
                        aResult.Exceptions.Add(new Exception("Đã tồn tại khách hàng có ID= " + obj.MaKH));
                    }
                    else
                    {
                        context.KhachHangs.Add(obj);
                        context.SaveChanges();
                    }
                }
                catch (Exception ex)
                {
                    aResult.Exceptions.Add(ex);
                }
                return aResult;
            }
        }

        public ActionResult Xoa(string ma)
        {
            ActionResult aResult = new ActionResult();
            using (QLKhachSanContext context =new QLKhachSanContext())
            {
                try
                {
                    var query = (from kh in context.KhachHangs
                                 where kh.MaKH == ma
                                 select kh).FirstOrDefault();
                    foreach (var ar in KiemTraRangBuoc(ma).Exceptions)
                    {
                        aResult.Exceptions.Add(ar);
                    }
                    if (KiemTraRangBuoc(ma).Exceptions.Count == 0)
                    {
                        context.KhachHangs.Remove(query);
                        context.SaveChanges();
                    }
                    else
                    {
                        query.TrangThaiDL = "Đã xóa";
                        context.SaveChanges();
                    }
                }
                catch (Exception ex)
                {
                    aResult.Exceptions.Add(ex);
                }
            }
            return aResult;
        }

        public ActionResult CapNhat(KhachHang obj)
        {
            ActionResult aResult = new ActionResult();
            using (QLKhachSanContext context = new QLKhachSanContext())
            {
                try
                {
                    var query = (from kh in context.KhachHangs
                                where kh.MaKH == obj.MaKH
                                select kh).FirstOrDefault();
                    if (query != null)
                    {
                        query.HoTenKH = obj.HoTenKH;
                        query.GioiTinh=obj.GioiTinh;
                        query.NgheNghiep = obj.NgheNghiep;
                        query.MaQT = obj.MaQT;
                        query.SDT = obj.SDT;
                        query.TrangThaiDL = obj.TrangThaiDL;
                        query.NgaySinh = obj.NgaySinh;
                    }
                    context.SaveChanges();
                }
                catch (Exception ex)
                {
                    aResult.Exceptions.Add(ex);
                }
                return aResult;
            }
        }

        public ActionResultAsList<KhachHang> LayDanhSach()
        {
            ActionResultAsList<KhachHang> aResult = new ActionResultAsList<KhachHang>();
            var context = new QLKhachSanContext();
            try
            {
                var query = from kh in context.KhachHangs
                            where kh.TrangThaiDL != "Đã xóa"
                            select kh;
                aResult.Result = query.ToList<KhachHang>();
                if (aResult.Result.Count == 0)
                {
                    aResult.Exceptions.Add(new Exception("Không tìm thấy khách hàng nào trong danh sách"));
                }
            }
            catch (Exception ex)
            {
                aResult.Exceptions.Add(ex);
            }
            return aResult;
        }

        private ActionResult KiemTraRangBuoc(string ma)
        {
            ActionResult aResult = new ActionResult();
            using (QLKhachSanContext context = new QLKhachSanContext())
            { 
                var query1=from cthdtp in context.ChiTietHoaDonThuePhongs
                           where cthdtp.MaKH == ma
                           select cthdtp;
                var query2 = from hddv in context.HoaDonDichVus
                             where hddv.MaKH == ma
                             select hddv;
                if (query1.Any())
                {
                    aResult.Exceptions.Add(new Exception("Tồn tại ràng buộc trên bảng ChiTietHoaDonThuePhong"));
                }
                if (query2.Any())
                {
                    aResult.Exceptions.Add(new Exception("Tồn tại ràng buộc trên bảng HoaDonDichVu"));
                }
            }
            return aResult;
        }


        public ActionResult Xoa(KhachHang ma)
        {
            throw new NotImplementedException();
        }

        public ActionResultAsList<KhachHang> TimKiemTheoDK(Expression<Func<KhachHang, bool>> predicate)
        {
            ActionResultAsList<KhachHang> aResult = new ActionResultAsList<KhachHang>();
            using (QLKhachSanContext context = new QLKhachSanContext())
            {
                try
                {
                    var query = (from kh in context.KhachHangs
                                 where kh.TrangThaiDL != "Đã xóa"
                                 select kh).Where(predicate);
                    aResult.Result = query.ToList<KhachHang>();
                    if (aResult.Result.Count == 0)
                    {
                        aResult.Exceptions.Add(new Exception("Không tìm thấy khách hàng nào thỏa điều kiện"));
                    }
                }
                catch (Exception ex)
                {
                    aResult.Exceptions.Add(ex);
                }
            }
            return aResult;
        }
    }
}
